package gray;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class SplitExample {

    //灰度参考值
    static final String user = "my-user-name";

    //灰度算法
    public static void main(String[] args) {
        for(int i=0;i<10000;i++){
            System.out.println(extracted(user + i)+"="+extracted2(user+i));
        }

        byteCint();
    }

    private static int extracted(String s) {
        try {
            //计算md5
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            byte[] digest = md5.digest(s.getBytes(StandardCharsets.UTF_8));
            //取前12个bit
            //计算之前发现结果是int。先进行转换然后再运算,为了保证转换结果数值不变，所以计算机在正数前边补0负数补1，所以用 digest[0] & 0xFF 去掉前边的补位
            int r = ((digest[0] & 0xFF) << 2) | ((digest[1]&0xC0) >> 6);

            return r;
        } catch (NoSuchAlgorithmException e) {
            System.out.println("++++ no md5 algorithm found");
        }
        return 0;
    }


    public static void byteCint(){
        byte a=-100; //二进制是：10011100
        System.out.println(a);
        int b=a; //二进制是：11111111111111111111111111111111111111111111111111111111 10011100
        System.out.println(b);
        //所以 0xFF 去掉 int 前边的符号位
    }


    private static int extracted2(String s) {
        try {
            //计算md5
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            byte[] digest = md5.digest(s.getBytes(StandardCharsets.UTF_8));
            //取前12个bit
            //计算之前发现结果是int。先进行转换然后再运算,为了保证转换结果数值不变，所以计算机在正数前边补0负数补1，所以用 digest[0] & 0xFF 去掉前边的补位
            int r = ((digest[0]  << 2) | (digest[1] >> 6));
            return r;
        } catch (NoSuchAlgorithmException e) {
            System.out.println("++++ no md5 algorithm found");
        }
        return 0;
    }

}